#include <stdio.h>
#include <stdlib.h>

struct cellule
{
       int info;
       struct cellule * suiv;
};
typedef struct cellule * liste;
////////////////////////////////////////////////////////////////////
int convertir (char c);
liste empiler (liste pile, int op);
liste depiler (liste pile, int *op);
int calculer(int op1, int op2, char c);
int est_operateur (char c);
int evaluer (char exp[]);

///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
int main ()
{
 int res;
 char exp[100];
 printf("saisissez l'expression suffixe \n");
 scanf("%s",exp);

 res=evaluer(exp);
 printf("le resultat est %d", res);
 scanf("%d",&res);
    
 return 0;   
}
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
int convertir (char c)
{
 char tab[2];
 int chiffre;
 tab[1]='\0';
 tab[0]=c;
 chiffre=atoi(tab);
 return chiffre;
}
int est_operateur (char c)
{
    if((c=='+')||(c=='-')||(c=='*')||(c=='/'))
    {
                                              return 1;
    }
    return 0;
}

int calculer(int op1,int op2, char c)  
{
    int res;
    switch (c)
    {
           case '+':
                res=op1+op2;
                
                break;
           case '-':
                res=op1-op2;
                break;
           case '*':
                res=op1*op2;
                
                break;
           case '/':
                res=op1/op2;
                break;
           default:
                   break;
          
    }
    return res;
} 
///////////////////////////////////////////
liste empiler (liste pile, int op)
{
//printf("empiler \n");
liste v=(liste)malloc(sizeof(struct cellule));


v->info=op;
//printf("%d",v->info);
v->suiv=pile;
pile=v;

return pile;     
}
//////////////////////////////////////////////
liste depiler (liste pile, int *op)
{
      //printf("depiler \n");
      liste temp;
      temp=(liste)malloc(sizeof(struct cellule));
      temp=pile;
      *op=temp->info;
      pile=temp->suiv;
      free(temp);
      return pile;
}
////////////////////////////////////////////////////////////
int evaluer (char exp[])
{
    int res;
    liste pile=(liste)malloc(sizeof(struct cellule));
    
    int i;
    int op1, op2;
    for(i=0;exp[i]!='\0';i++)
    {
                            
                             if(est_operateur(exp[i])==0)
                             {
                             op1=convertir(exp[i]);
                             pile=empiler(pile,op1);
                             
                            
                             }
                             else
                             {
                           
                             pile=depiler(pile,&op1);
                             
                             pile=depiler(pile,&op2);
                            
                             res=calculer(op1,op2,exp[i]);
                             pile=empiler(pile,res);
                             }
                            
                            
    } 
    pile=depiler(pile,&res);
    return res;
}
